package multimedia;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import modelUtil.Configuracion;
import modelUtil.Util;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLMultimediaDAO extends AbstractMultimediaDAO {
	
	private Document documentoImagenes;
	private Document documentoSonidos;
	private String ruta = "";

	public void registrarMultimedia(MultimediaTO multimedia, String tipo) {
		try{
			if(buscarPorNombre(multimedia.getPath(), tipo) != null){
				Util.popup(0, "No se permite registrar imagenes con nombres identicos. Por favor, cambiele el nombre");
				return;
			}
			
			Configuracion.instancia().leerDoc();
			Element elemento=null;
		
			Document documento = getDocumento(tipo);
				
			Node raiz = documento.getFirstChild();
			if(tipo.equals("imagen")){
				elemento = documento.createElement("imagen");
				ruta = Configuracion.instancia().getListaImagenes();
			}else{
				if(tipo.equals("sonido")){
					elemento = documento.createElement("sonido");
					ruta = Configuracion.instancia().getListaSonidos();
				}
			}
			try{
				Util.addTextElement(documento, elemento, "palabraClave", multimedia.getPalabraClave());

				Util.addTextElement(documento, elemento, "path", multimedia.getPath());
				if(tipo.equals("imagen")) Util.addTextElement(documento, elemento, "categoria", multimedia.getCategoria());

				raiz.appendChild(elemento);
				Util.guardarXML(documento, ruta);
		
				if(tipo.equals("sonido")) documentoSonidos = documento;
				if(tipo.equals("imagen")) documentoImagenes = documento;
			} catch (Exception ex) {
				Util.popup(0,
						"Error al guardar el documento XML. Intentelo de nuevo");
				return;
			}
		} catch (Exception ex) {
			Util.popup(0, "Error al guardar el archivo multimedia. Intentelo de nuevo");
		}		
	}
	

	public MultimediaTO buscarPorNombre(String nombre, String tipo) {
		MultimediaTO multimedia = new MultimediaTO();
		Configuracion.instancia().leerDoc();
		
		Document documento = getDocumento(tipo);

		if(tipo.equals("sonido")) documentoSonidos = documento;
		if(tipo.equals("imagen")) documentoImagenes = documento;
		
		NodeList iterator = documento.getElementsByTagName("path");
		for (int i = 0; i < iterator.getLength(); i++) {
			Node nodo = iterator.item(i);

			if (nodo instanceof Element) {
				if (nodo.getTextContent().equals(nombre)) {
					multimedia.setPath(nombre);
					Node nodoAux = nodo.getParentNode();
					NodeList hijosNodo = nodoAux.getChildNodes();
					for(int j=0; j<hijosNodo.getLength(); j++){
						Node palabra = hijosNodo.item(j);

						if(palabra instanceof Element){
							if(palabra.getNodeName().equals("palabraClave")){
								multimedia.setPalabraClave(palabra.getTextContent());
							}
						}
					}
					return multimedia;
				}
			}
		}
		return null;
	}
	

	public List<MultimediaTO> buscarMultimedia(String palabraClave, String tipo) {
		List<MultimediaTO> archivos = new ArrayList<MultimediaTO>();
		Configuracion.instancia().leerDoc();

		Document documento = getDocumento(tipo);
		
		if(tipo.equals("sonido")) documentoSonidos = documento;
		if(tipo.equals("imagen")) documentoImagenes = documento;
		
		Node raiz = documento.getFirstChild();
		NodeList iterator = raiz.getChildNodes();
		for (int i = 0; i < iterator.getLength(); i++) {
			Node nodo = iterator.item(i);
			if (nodo instanceof Element) {
				MultimediaTO archivoMultimedia = new MultimediaTO();
				NodeList hijos = nodo.getChildNodes();
				for (int j = 0; j < hijos.getLength(); j++) {
					Node nodoAux = hijos.item(j);
					if (nodoAux instanceof Element) {
						if (nodoAux.getNodeName().equals("palabraClave")) archivoMultimedia.setPalabraClave(nodoAux.getTextContent());
						if (nodoAux.getNodeName().equals("path")) archivoMultimedia.setPath(nodoAux.getTextContent());
						if(tipo.equals("imagen")){
							if (nodoAux.getNodeName().equals("categoria")) archivoMultimedia.setCategoria(nodoAux.getTextContent());
						}
					}
				}
				if(Util.contiene(archivoMultimedia.getPalabraClave(), palabraClave)) archivos.add(archivoMultimedia);}
		}
		return archivos;
	}
	

	public void eliminarMultimedia(String multimedia, String tipo) {
		try{
			Configuracion.instancia().leerDoc();

			Document documento = getDocumento(tipo);

			boolean eliminado = false;
			
			NodeList iterator = documento.getElementsByTagName("path");
			Node raiz = documento.getFirstChild();
			for (int i = 0; i < iterator.getLength(); i++) {
				Node nodo = iterator.item(i);
				// iterator.Current.MoveToFirstChild();
				if (nodo instanceof Element) {
					if (nodo.getTextContent().equals(multimedia)) {
						Node nodoAux = nodo.getParentNode();
						raiz.removeChild(nodoAux);
						eliminado = true;
					}
				}
			}
			
			if(eliminado){
				if(tipo.equals("sonido")) ruta = Configuracion.instancia().getListaSonidos();
				if(tipo.equals("imagen")) ruta = Configuracion.instancia().getListaImagenes();
				Util.guardarXML(documento, ruta);
				if(tipo.equals("sonido")) documentoSonidos = documento;
				if(tipo.equals("imagen")) documentoImagenes = documento;
			}else Util.popup(0, "Error al eliminar el archivo multimedia. No se encuentra dicho archivo");
		} catch (Exception ex) {
			Util.popup(0, "Error al eliminar el archivo multimedia. Intentelo de nuevo");
		}
	}

	public void editarMultimedia(String nombre, String nuevaPalabraClave, String tipo) {
		try{
			Configuracion.instancia().leerDoc();

			Document documento = getDocumento(tipo);
		
			boolean editado = false;
			NodeList iterator = documento.getElementsByTagName("path");
			Node raiz = documento.getFirstChild();
			for (int i = 0; i < iterator.getLength(); i++) {
				Node nodo = iterator.item(i);
				// iterator.Current.MoveToFirstChild();
				if (nodo instanceof Element) {
					if (nodo.getTextContent().equals(nombre)) {
						Node nodoAux = nodo.getParentNode();
						Node nodoAux2 = nodoAux;
						raiz.removeChild(nodoAux);
						NodeList hijosNodo = nodoAux2.getChildNodes();
						for(int j=0; j<hijosNodo.getLength();j++){
							Node palabra = hijosNodo.item(j);
							if (palabra instanceof Element){
								if(palabra.getNodeName().equals("palabraClave")){
									Node aux = palabra;
									nodoAux2.removeChild(palabra);
									aux.setTextContent(nuevaPalabraClave);
									nodoAux2.appendChild(aux);
									editado = true;
								}
							
							}
						
						}
						raiz.appendChild(nodoAux2);
					}
				}
			}
			if (editado){
				if(tipo.equals("sonido")) ruta = Configuracion.instancia().getListaSonidos();
				if(tipo.equals("imagen")) ruta = Configuracion.instancia().getListaImagenes();
				Util.guardarXML(documento, ruta);
				if(tipo.equals("sonido")) documentoSonidos = documento;
				if(tipo.equals("imagen")) documentoImagenes = documento;
			}else Util.popup(0, "Error al editar el archivo multimedia. No se encuentra dicho archivo");
		} catch (Exception ex) {
			Util.popup(0, "Error al editar el archivo multimedia. Intentelo de nuevo");
		}
	}
	
	
	private Document getDocumento(String tipo){
		Document documento = null;
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		if(tipo.equals("imagen")){
			if(documentoImagenes != null){
				documento = documentoImagenes;
			}else{
				try {
					DocumentBuilder builder = factory.newDocumentBuilder();
					documento = builder.parse(new File(Configuracion.instancia().getListaImagenes()));
				} catch (Exception spe) {}	
			}
		}else if(tipo.equals("sonido")){
			      	if(documentoSonidos != null){
			      		documento = documentoSonidos;
			      	}else{
			      		try {
			      			DocumentBuilder builder = factory.newDocumentBuilder();
			      			documento = builder.parse(new File(Configuracion.instancia().getListaSonidos()));
			      		} catch (Exception spe) {}	
			      	}
		}
		
		return documento;
	}
	
	public void main(String [ ] args){
		List<MultimediaTO> lista = buscarMultimedia(null, "imagen");
		Iterator<MultimediaTO> iterador = lista.iterator();
		while(iterador.hasNext()){
			System.out.println(iterador.next().getPath());
		}
		MultimediaTO imagen = buscarPorNombre("1.png", "imagen");
		System.out.println(imagen==null);
	}
}





